#! /usr/bin/env python
# -*- coding: utf-8 -*-

"""
 *
 * - Klon Asteroids-a
 *
 *  - za testiranje postojecih i dodavanje novih mogucnosti enginea
 *
 * Autori: Koki007
 * Verzija: 0.1
 * Datum: 04.01.2011
 *
"""
import os, pygame
from pygame.locals import *

from DB_engine.engine import cEngine
from DB_engine.stanje import cStanje
from DB_engine.mapa import cMapa
from DB_engine.kamera import cKamera
from DB_engine.objekti import cObjekt, cPokretni_objekt

# iza ovog nadasve mastovitog imena se krije objekt koji koji scrolla iz jedne strane ekrana u suprotnu, kao i u asteroidsima
class cSkrolabilni_objekt(cPokretni_objekt):

    def azuriraj(self):
        cPokretni_objekt.azuriraj(self)
        rez_x, rez_y = self.engine.provjeri_rezoluciju()

        if self.provjeri_poziciju_x() > rez_x:
            self.pozicija_x = 0

        if self.provjeri_poziciju_x() < 0:
            self.pozicija_x = rez_x

        if self.provjeri_poziciju_y() > rez_y:
            self.pozicija_y = 0

        if self.provjeri_poziciju_y() < 0:
            self.pozicija_y = rez_y

class cAsteroid_veliki(cSkrolabilni_objekt):

    def __init__(self, engine, ime, x, y, animacija, colorkey): 
            cSkrolabilni_objekt.__init__(self, engine, ime, x, y, animacija, colorkey)
            self.postavi_grupu("asteroid")
            self.postavi_interaktivnost("asteroid", False)

    def odgovor_na_sudar(self, objekt):
        if objekt.je_grupa("metak"):
            objekt.izbrisi()
            self.fade_out(200)
            self.postavi_interaktivnost("metak", False)
            asteroid1 = cAsteroid_mali( engine, os.path.join("igre", "asteroids_test",'asteroid_mali.png') , self.provjeri_poziciju_x(), self.provjeri_poziciju_y(), False, (255,255,255) )
            asteroid2 = cAsteroid_mali( engine, os.path.join("igre", "asteroids_test",'asteroid_mali.png') , self.provjeri_poziciju_x(), self.provjeri_poziciju_y(), False, (255,255,255) )
            asteroid3 = cAsteroid_mali( engine, os.path.join("igre", "asteroids_test",'asteroid_mali.png') , self.provjeri_poziciju_x(), self.provjeri_poziciju_y(), False, (255,255,255) )
            self.mapa.dodaj_objekt("glavni",  asteroid1)
            self.mapa.dodaj_objekt("glavni",  asteroid2)
            self.mapa.dodaj_objekt("glavni",  asteroid3)
            asteroid1.ubrzaj_za_relativni_kut( 1, 75 )
            asteroid2.ubrzaj_za_relativni_kut( 1, 150 )
            asteroid3.ubrzaj_za_relativni_kut( 1, 270 )

class cAsteroid_mali(cSkrolabilni_objekt):

    def __init__(self, engine, ime, x, y, animacija, colorkey): 
            cSkrolabilni_objekt.__init__(self, engine, ime, x, y, animacija, colorkey)
            self.postavi_grupu("asteroid")
            self.postavi_interaktivnost("asteroid", False)

    def odgovor_na_sudar(self, objekt):
        if objekt.interaktivna_grupa == "metak":
            objekt.izbrisi()
            self.fade_out(200)

# glavno (i jedino) stanje u igri
class glavno_stanje(cStanje):
    def __init__(self, upravitelj, engine, ime):
        cStanje.__init__(self, upravitelj, engine, ime)

        
        self.mapa = cMapa(engine)
        self.mapa.dodaj_sloj("glavni",  1)
        self.mapa.dodaj_sloj("metci", 1)

        self.igrac = cSkrolabilni_objekt( engine, os.path.join("igre", "asteroids_test",'brod.png') , 300, 300, False, (255,255,255) )
        self.igrac.postavi_grupu("igrac")
        self.igrac.postavi_interaktivnost("metak", False)
        self.mapa.dodaj_objekt("glavni",  self.igrac)

        asteroid1 = cAsteroid_veliki( engine, os.path.join("igre", "asteroids_test",'asteroid.png') , 50, 50, False, (255,255,255) )
        asteroid2 = cAsteroid_veliki( engine, os.path.join("igre", "asteroids_test",'asteroid.png') , 500, 50, False, (255,255,255) )
        asteroid3 = cAsteroid_veliki( engine, os.path.join("igre", "asteroids_test",'asteroid.png') , 50, 500, False, (255,255,255) )
        self.mapa.dodaj_objekt("glavni",  asteroid1)
        self.mapa.dodaj_objekt("glavni",  asteroid2)
        self.mapa.dodaj_objekt("glavni",  asteroid3)
        asteroid1.ubrzaj_za_relativni_kut( 1, 30 )
        asteroid2.ubrzaj_za_relativni_kut( 1, 100 )
        asteroid3.ubrzaj_za_relativni_kut( 1, 200 )

        self.kamera = cKamera(self.engine.provjeri_rezoluciju(), engine.glavni_buffer )
        self.kamera.fokusiraj_na_centar()
        
        self.igrac.titraj(250, 3000)
        print "Inicijalizirano glavno stanje"
        pass
        
        
    def primi_event(self, event):
        if event.type == KEYDOWN:
            if event.key == K_SPACE:
                metak = cSkrolabilni_objekt( self.engine, os.path.join("igre", "asteroids_test",'metak.png') , self.igrac.provjeri_poziciju_x(), self.igrac.provjeri_poziciju_y(), False, (255,255,255) )
                self.mapa.dodaj_objekt("metci", metak)
                metak.postavi_grupu("metak")
                metak.ubrzaj_za_relativni_kut(3, self.igrac.provjeri_kut() )
                metak.postavi_kut(self.igrac.provjeri_kut())
                metak.task_tajmer.dodaj_task(5000, 0, metak.izbrisi)
        #GUI_upravitelj.primi_event(event)
        pass

        
    # AZURIRANJE IGRE      
    def azuriraj(self):
        pritsnute_tipke = pygame.key.get_pressed()
        if pritsnute_tipke[K_LEFT]: self.igrac.postavi_kut( self.igrac.provjeri_kut() +3)
        if pritsnute_tipke[K_RIGHT]: self.igrac.postavi_kut( self.igrac.provjeri_kut()-3 )
        if pritsnute_tipke[K_UP]: self.igrac.ubrzaj_za_relativni_kut( 0.1 )

        self.mapa.azuriraj()
        self.kamera.azuriraj() # azurirati poziciju kamere tek nakon sto se azurira mapa
        #GUI_upravitelj.azuriraj()
        pass
        
    # CRTANJE IGRE    
    def crtaj(self):
        self.engine.glavni_buffer.fill((0, 0, 0)) # pozadina je crna
        self.kamera.crtaj_mapu(self.mapa, "metci",  self.engine.glavni_buffer)
        self.kamera.crtaj_mapu(self.mapa, "glavni",  self.engine.glavni_buffer)
        #GUI_upravitelj.crtaj(glavni_buffer)
        pass
        


# pocetak main-a
engine = cEngine(800, 600, 60)
engine.upravitelj_stanja.dodaj_stanje("glavno", glavno_stanje)
engine.upravitelj_stanja.aktiviraj_stanje("glavno")
engine.pokreni()
